<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    /**
     * 获取任意值的精确类型字符串
     *
     * 该函数通过以下方式确定类型：
     * 1. 优先处理特殊值：undefined 和 null
     * 2. 对于其他值，使用 Object.prototype.toString 方法进行精确类型检测
     *
     * @param {any} obj - 需要检测类型的任意值
     * @returns {string} 返回小写的类型标识字符串，例如：
     *   - 基础类型：'undefined'、'null'、'number'、'string'、'boolean'
     *   - 引用类型：'array'、'object'、'date'、'regexp' 等
     *   - 其他类型：'map'、'set' 等
     */
    function getType(obj){
        if(obj === undefined){
            return 'undefined'
        }
        if (obj === null){
            return 'null'
        }

        // 使用标准方法获取精确类型标识
        const toString = Object.prototype.toString
        const typeStr = toString.call(obj)

        // 提取并格式化类型字符串（移除"[object ]"包装并转为小写）
        const type = typeStr.slice(8,-1).toLowerCase()
        return type
    }
    console.log(getType(undefined));        // 'undefined'
    console.log(getType(null));             // 'null'
    console.log(getType(true));             // 'boolean'
    console.log(getType(42));               // 'number'
    console.log(getType('str'));            // 'string'
    console.log(getType(Symbol()));         // 'symbol'
    console.log(getType(123n));             // 'bigint'
    console.log(getType([]));               // 'array'
    console.log(getType({}));               // 'object'
    console.log(getType(function() {}));    // 'function'
    console.log(getType(new Date()));       // 'date'
    console.log(getType(/abc/));            // 'regexp'
    console.log(getType(new Map()));        // 'map'
    console.log(getType(new Set()));        // 'set'
</script>
</html>